re_injecting = 1;
}
- /*
- * If event requires injecting then do not inject int.
- */
- if ( unlikely(v->arch.hvm_svm.inject_event) )
- {
- v->arch.hvm_svm.inject_event = 0;
- return;
- }
-
- /*
- * Create a 'fake' virtual interrupt on to intercept as soon
- * as the guest _can_ take interrupts.
- */
- if ( irq_masked(vmcb->rflags) || vmcb->interrupt_shadow )
- {
- vmcb->general1_intercepts |= GENERAL1_INTERCEPT_VINTR;
- svm_inject_extint(v, 0x0); /* actual vector doesn't really matter */
- return;
- }
-
/* Previous interrupt still pending? */
if ( vmcb->vintr.fields.irq )
{
hvm_set_callback_irq_level();
if ( cpu_has_pending_irq(v) )
+ {
+ /*
+ * Create a 'fake' virtual interrupt on to intercept as soon
+ * as the guest _can_ take interrupts. Do not obtain the next
+ * interrupt from the vlapic/pic if unable to inject.
+ */
+ if ( irq_masked(vmcb->rflags) || vmcb->interrupt_shadow )
+ {
+ vmcb->general1_intercepts |= GENERAL1_INTERCEPT_VINTR;
+ svm_inject_extint(v, 0x0); /* actual vector doesn't really matter */
+ return;
+ }
intr_vector = cpu_get_interrupt(v, &intr_type);
+ }
}
/* have we got an interrupt to inject? */
ASSERT(vmcb->eventinj.fields.v == 0);
vmcb->eventinj = event;
- v->arch.hvm_svm.inject_event=1;
}
static void stop_svm(void)
exit_reason = vmcb->exitcode;
save_svm_cpu_user_regs(v, regs);
- v->arch.hvm_svm.inject_event = 0;
-
if (exit_reason == VMEXIT_INVALID)
{
svm_dump_vmcb(__func__, vmcb);
clear_bit( ARCH_SVM_VMCB_ASSIGN_ASID, &v->arch.hvm_svm.flags );
}
}
-
+
/*
* Local variables:
* mode: C